-- UIPropertyInfo
-- Created by chengb Apr/11/2015
-- 道具查看界面

require "game/ui/form/hero/UIPropertySelectTarget"
require "game/ui/form/equips/UIDiary"
require "game/ui/form/equips/UIBookInfo"
require "game/ui/form/dungeon/special/UIEngineeringManual"

UIPropertyInfo = class("UIPropertyInfo",function()
    return cc.Layer:create();
end);

PROPERTY_OPERATE_DEFAULT            = 0;    -- 默认使用
PROPERTY_OPERATE_SUBMIT             = 1;    -- 提交使用

function UIPropertyInfo.create(classId, operateType, extraPara)
    return UIPropertyInfo.new(classId, operateType, extraPara);
end

-- 内部函数声明
local resize;

function UIPropertyInfo:ctor(classId, operateType, extraPara)
    -- 初始化
    self:setName("UIPropertyInfo");

    local node = cc.CSLoader:createNode("layout/hero/PropertyInfo.csb");
    self:addChild(node);
    self.node = node;

    self.extraPara = extraPara;

    self:setLocalZOrder(UIMgr.BONUS_NOTIFY_ZORDER + 1);

    self.classId = classId;
    self.operateType = operateType or PROPERTY_OPERATE_DEFAULT;

    -- 注册点击事件
    self:registerTouchEvent();

    -- 注册事件处理回调函数
    self:registerEventCallback();

    -- 重绘
    self:redraw();

    -- 适配
    resize(node);
end

-- 适配
function resize(node)
    -- bg居中显示并充满整个屏幕
    AlignM.fitToScreen(node, "bg");

    -- CT居中并缩放至合适大小
    AlignM.alignToCenter(node, "CT");

    -- BT置于底部并缩放至合适大小
    AlignM.alignToBottomCenter(node, "BT");
end

-- 重绘
function UIPropertyInfo:redraw()
    -- 重绘返回按钮
    local btnBack = findChildByName(self.node, "BT/btn_back");
    TextStyleM.setTextStyle(btnBack, TextStyleM.TEXT_SIZE_MIDDLE, TextStyleM.TEXT_COLOR_BROWN_YELLOW, true);
    btnBack:setTitleText(getLocStr("btn_text_back"));

    -- 重绘使用按钮
    local btnUse = findChildByName(self.node, "CT/btn_use");

    TextStyleM.setTextStyle(btnUse, TextStyleM.TEXT_SIZE_MIDDLE, TextStyleM.TEXT_COLOR_BROWN_YELLOW, true);

    -- 使用多个按钮
    local btnUseMulti = findChildByName(self.node, "CT/btn_use_multi");
    local btnUseOne = findChildByName(self.node, "CT/btn_use_one");

    -- 先隐藏
    btnUseMulti:setVisible(false);
    btnUseOne:setVisible(false);

    -- 提交操作时，显示提交
    if self.operateType == PROPERTY_OPERATE_SUBMIT then
        -- 提交按钮
        btnUse:setTitleText(getLocStr("btn_text_select"));
        btnUse:setVisible(true);
    else
        if ItemM.query(self.classId, "group") == 26 then
            -- 可阅读的书籍
            btnUse:setTitleText(getLocStr("btn_text_read"));
        else
            btnUse:setTitleText(getLocStr("btn_text_use"));
        end

        -- 如果是提交类道具，隐藏使用按钮
        if PropertyM.query(self.classId, "target") == PROPERTY_SUBMIT then
            btnUse:setVisible(false);
        else
            btnUse:setVisible(true);

            -- 判断可不可以使用多个
            if PropertyM.showUseMulti(self.classId) then
                -- 隐藏长的按钮
                btnUse:setVisible(false);
                TextStyleM.setTextStyle(btnUseOne, TextStyleM.TEXT_SIZE_MIDDLE, TextStyleM.TEXT_COLOR_BROWN_YELLOW, true);
                TextStyleM.setTextStyle(btnUseMulti, TextStyleM.TEXT_SIZE_MIDDLE, TextStyleM.TEXT_COLOR_BROWN_YELLOW, true);
                btnUseOne:setTitleText(string.format(getLocStr("btn_text_use_property"), 1));

                local applyTimes = PropertyM.calcApplyTimes(self.classId);
                btnUseMulti:setTitleText(string.format(getLocStr("btn_text_use_property"), applyTimes));

                btnUseOne:setVisible(true);
                btnUseMulti:setVisible(true);
            end
        end
    end

    local info = ItemM.query(self.classId);
    if not info then
        return;
    end

    -- 道具名称
    local nameLabel = findChildByName(self.node, "CT/name");
    TextStyleM.setTextStyle(nameLabel, TextStyleM.TEXT_SIZE_MIDDLE, TextStyleM.TEXT_COLOR_DARK_RED);
    local itemName = info["name"];

    if FormulaM.invoke("IS_STRANGE_BOOK", self.classId) == true then
        itemName = CaveHideItemM.getStrangeBookName();
    end
    nameLabel:setString(itemName);

    -- 道具描述
    local descLabel = findChildByName(self.node, "CT/desc");
    TextStyleM.setTextStyle(descLabel, TextStyleM.TEXT_SIZE_SMALL, TextStyleM.TEXT_COLOR_DARK_BROWN, nil, nil, nil, nil, nil, TextStyleM.TEXT_SIZE_SMALL);
    descLabel:setString(ItemM.getItemDesc(self.classId));

    -- 细节描述
    local detailLabel = findChildByName(self.node, "CT/detail");

    TextStyleM.setTextStyle(detailLabel, TextStyleM.TEXT_SIZE_SMALL, TextStyleM.TEXT_COLOR_BLUE, nil, nil, nil, nil, nil, TextStyleM.TEXT_SIZE_SMALL);
    detailLabel = applyString(detailLabel, ItemM.getItemDetail(self.classId));

    -- 自适应所有组件
    local bg = findChildByName(self.node, "CT/bg");
    AlignM.adaptLayout(bg, AlignM.BG_SIZE_NORMAL, { nameLabel, descLabel, detailLabel, btnUse, btnUseOne});

    -- 将使用多个的按钮，设置成与现有的useOne按钮纵坐标相同
    btnUseMulti:setPositionY(btnUseOne:getPositionY());
end

-- 注册点击事件
function UIPropertyInfo:registerTouchEvent()
    -- 注册返回按钮点击事件
    local btnBack = findChildByName(self.node, "BT/btn_back");
    local function onBackClick(sender, eventType)
        if eventType == ccui.TouchEventType.ended then
            -- 关闭当前界面
            AudioM.playFx("button_return");
            UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");
        end
    end
    AddBackEventHandler(self, btnBack, onBackClick);

    -- 点击背景关闭界面
    local bgImg = findChildByName(self.node, "bg/bgImg");
    local function onBgClick(sender, eventType)
        if eventType == ccui.TouchEventType.ended then
            -- 关闭当前界面
            AudioM.playFx("button_return");
            UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");
        end
    end
    bgImg:addTouchEventListener(onBgClick);

    -- 注册使用按钮点击事件
    local btnUseOne = findChildByName(self.node, "CT/btn_use_one");

    local btnUse = findChildByName(self.node, "CT/btn_use");
    local function onUseClick(sender, eventType)
        if eventType == ccui.TouchEventType.ended then
            AudioM.playFx("button_click");

            if self.operateType == PROPERTY_OPERATE_SUBMIT then
                -- 提交类的
                -- 抛出选择装备的事件
                EventMgr.fire(event.BLACKSMITH_INPUT_EQUIP,
                    table.add({ ["classId"] = self.classId, ["isEquiped"] = nil}, self.extraPara));

                -- 关闭当前界面
                UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");

                -- 关闭装备界面
                closeEquipUI();
                return;
            end

            -- 获取道具的使用目标类型
            local target = PropertyM.query(self.classId, "target");
            if target == PROPERTY_SELF  or
               target == PROPERTY_SUMMON then
                -- 对自身使用
                -- 如果是罗盘，另外判断
                if FormulaM.invoke("IS_RISKER_COMPASS", self.classId) then
                    local ret = RiskerEquipM.canUseCompass(self.classId);
                    if ret == true then
                        DungeonActionM.go("generate_compass_bonus", 0, self.classId);

                        -- 打开页面
                        require "game/ui/form/dungeon/special/UICompass"

                        UIMgr.getCurrentScene():removeFormByName("UICompass");

                        local uiForm = UICompass.create(self.classId);

                        UIMgr.getCurrentScene():addForm(uiForm);

                        closeEquipUI();

                        UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");
                    elseif type(ret) == "string" then
                        -- 提示
                        alert(getLocStr(ret));
                    end

                    return;
                end

                -- 道具名字
                local name = ItemM.query(self.classId, "name");
                local dbase = PropertyM.query(self.classId, "dbase") or {};
                if dbase["ui_module"] then
                    local ret = PropertyM.canUse(self.classId);
                    if ret ~= true then
                        if type(ret) == "string" then
                            local tip = getLocStr(ret);
                            if tip ~= nil then
                                alert(string.format(getLocStr(ret), name));
                            else
                                alert(string.format(ret, name));
                            end
                        else
                            alert(string.format(getLocStr("use_property_fail"), name));
                        end

                        return;
                    end

                    local mod = require("game/ui/form/property/" .. dbase["ui_module"]);
                    if mod and mod.init and true == mod.init(self.classId) then
                        closeEquipUI();

                        UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");

                        return;
                    end
                end

                if FormulaM.invoke("IS_STRANGE_BOOK", self.classId) then
                   name = CaveHideItemM.getStrangeBookName();
                end

                -- 如果满足使用条件，则先关闭包裹界面
                -- 注：必须在使用道具之前包裹界面，因为UIDungeonMain关注了使用道具的事件播放奖励特效
                -- 当UIEquips关闭时会执行showMenu，这样才能保证奖励光效正确播放
                local ret = PropertyM.canUse(self.classId);
                if ret == true then
                    closeEquipUI();
                else
                    -- 判断不能使用，给个提示
                    local info = PropertyM.query(self.classId);

                    -- 关闭界面
                    UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");

                    if info.target == PROPERTY_SUMMON or info["dbase"]["summon_item"] == 1 then
                        if type(ret) == "number" then
                            local summonId = ret;
                            alert(string.format(getLocStr("do_summon_fail"), SummonM.query(summonId, "name")));
                        end
                    end

                    if type(ret) == "string" then
                        local tip = getLocStr(ret);
                        if tip ~= nil then
                            alert(string.format(getLocStr(ret), name));
                        else
                            alert(string.format(ret, name));
                        end
                    else
                        alert(string.format(getLocStr("use_property_fail"), name));
                    end

                    if info["dbase"]["close_equip_ui"] == 1 then
                        closeEquipUI();
                    end

                    return;
                end

                -- 开始收集奖励
                BonusM.startBonusCollect();

                -- 使用道具
                ret = DungeonActionM.go("use_property", 0, self.classId);

                -- 结束收集奖励
                BonusM.endBonusCollect();

                if ret == true then
                    -- 使用成功
                    EventMgr.fire(event.PLAYER_MOVE, -1);
                    local msg = PropertyM.getSuccessUseTip(self.classId);
                    if type(msg) ~= "string" or string.len(msg) <= 0 then
                        msg = string.format(getLocStr("use_property_succ"), name) .. "\n";
                    end
                    local args = PropertyM.query(self.classId, "args");
                    local alertList = splitString(msg, "\n");
                    splitAlert(alertList);

                    -- 如果是恢复类/道具奖励类道具，需要告知地牢主界面播放光效
                    if target == PROPERTY_SELF then
                        -- 抛出事件
                        EventMgr.fire(event.SELF_BONUS_ITEM_USED);
                    end

                    if not PropertyM.isDelayPlay(self.classId) then
                        EventMgr.fire(event.PLAYER_MOVE, pos);
                    end

                    -- 关闭当前界面
                    UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");
                else
                    -- 关闭界面
                    UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");

                    -- 使用失败了
                    alert(string.format(getLocStr("use_property_fail"), name));
                end
            elseif target == PROPERTY_ENEMY then
                -- 对其他目标使用
                -- 打开目标选择界面
                -- 能否使用的判断在该界面处理
                UIMgr.getCurrentScene():removeFormByName("UIPropertySelectTarget");
                local uiForm = UIPropertySelectTarget.create(self.classId);
                UIMgr.getCurrentScene():addForm(uiForm);

                -- 关闭当前界面
                closeEquipUI();
                UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");
            else
                -- 其他类型，暂不处理
            end
        end
    end
    btnUse:addTouchEventListener(onUseClick);
    btnUseOne:addTouchEventListener(onUseClick);

    -- 使用多个（这边是指所有一起使用）
    local btnUseMulti = findChildByName(self.node, "CT/btn_use_multi");
    local function onUseMulti(sender, eventType)
        if eventType == ccui.TouchEventType.ended then
            AudioM.playFx("button_click");
            self:tryUseAll();
        end
    end
    btnUseMulti:addTouchEventListener(onUseMulti);

end

-- 注册事件处理回调
function UIPropertyInfo:registerEventCallback()
    self:registerScriptHandler(function(eventType)
        if eventType == "exit" then
            cclog("UIPropertyInfo 界面析构清理");

            EventMgr.removeAll("UIPropertyInfo");
        end
    end);
end

-- 使用多个，这边暂时只处理使用道具(暂时只处理了针对自己的)
function UIPropertyInfo:tryUseAll()
    -- 获取道具的使用目标类型
    -- 对自身使用
    local target = PropertyM.query(self.classId, "target");
    if target ~= PROPERTY_SELF  and
        target ~= PROPERTY_SUMMON then
        return;
    end

    -- 直接使用
    local name = ItemM.query(self.classId, "name");

    -- 如果满足使用条件，则先关闭包裹界面
    -- 注：必须在使用道具之前包裹界面，因为UIDungeonMain关注了使用道具的事件播放奖励特效
    -- 当UIEquips关闭时会执行showMenu，这样才能保证奖励光效正确播放
    local ret = PropertyM.canUseMulti(self.classId);
    if ret == true then
        closeEquipUI();
    else
        -- 判断不能使用，给个提示
        local info = PropertyM.query(self.classId);

        -- 关闭界面
        UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");

        if info.target == PROPERTY_SUMMON or info["dbase"]["summon_item"] == 1 then
            if type(ret) == "number" then
                local summonId = ret;
                alert(string.format(getLocStr("do_summon_fail"), SummonM.query(summonId, "name")));
            elseif ret == "do_summon_fail2" then
                alert(getLocStr(ret));
            end
        end

        if type(ret) == "string" then
            local tip = getLocStr(ret);
            if tip ~= nil then
                alert(string.format(getLocStr(ret), name));
            else
                alert(string.format(ret, name));
            end
        else
            alert(string.format(getLocStr("use_property_fail"), name));
        end
        return;
    end

    -- 开始收集奖励
    BonusM.startBonusCollect();

    -- 使用道具
    ret = DungeonActionM.go("use_multi_property", 0, self.classId);

    -- 结束收集奖励
    BonusM.endBonusCollect();

    if ret == true then
        -- 使用成功
        EventMgr.fire(event.PLAYER_MOVE, -1);
        local msg = PropertyM.getSuccessUseTip(self.classId);
        if type(msg) ~= "string" or string.len(msg) <= 0 then
            msg = string.format(getLocStr("use_property_succ"), name) .. "\n";
        end
        local args = PropertyM.query(self.classId, "args");

        alert(msg);

        -- 如果是恢复类/道具奖励类道具，需要告知地牢主界面播放光效
        if target == PROPERTY_SELF then
            -- 抛出事件
            EventMgr.fire(event.SELF_BONUS_ITEM_USED, {["arrange"] = 1});
        end

        if not PropertyM.isDelayPlay(self.classId) then
            EventMgr.fire(event.PLAYER_MOVE, pos);
        end

        -- 关闭当前界面
        UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");
    else
        -- 关闭界面
        UIMgr.getCurrentScene():removeFormByName("UIPropertyInfo");

        -- 使用失败了
        alert(string.format(getLocStr("use_property_fail"), name));
    end
end
